package com.francisco.ets.util;
/******************************************************
Cours:  LOG121
Projet: Squelette du laboratoire #1
Nom du fichier: CommBase.java
Date créé: 2013-05-03
*******************************************************
Historique des modifications
*******************************************************
*@author Patrice Boucher
2013-05-03 Version initiale
*******************************************************/  

import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.SwingWorker;

import com.francisco.ets.controleur.ControleurFrontal;
import com.francisco.ets.util.Labo1Const.ProprietesChangees;

/**
 * Base d'une communication via un fil d'exécution parallèle.
 */
public class CommBase {
	
	private final int DELAI = 1000;
	private SwingWorker threadComm =null;
	
	private PropertyChangeListener listenerChangementPropriete=null;
	private boolean isActif = false;
	private Socket connectionClient;
	
	private BufferedReader inputStream;
	private PrintWriter outputStream;
	
	/**
	 * Constructeur
	 */
	public CommBase(){
	}
	
	/**
	 * D�finir le r�cepteur de l'information re�ue dans la communication avec le serveur
	 * @param listener sera alerté lors de l'appel de "firePropertyChanger" par le SwingWorker
	 */
	public void setListenerChangementPropriete(PropertyChangeListener listenerChangementPropriete) 
	{
		this.listenerChangementPropriete = listenerChangementPropriete;
	}
	
	/**
	 * Démarre la communication
	 */
	public void start(){
		isActif=true;
		creerCommunication();
	}
	
	/**
	 * Arrête la communication
	 */
	public void stop(){
		if(threadComm!=null)
			threadComm.cancel(true); 
		isActif = false;
	}
	
	/**
	 * Créer le nécessaire pour la communication avec le serveur
	 */
	protected void creerCommunication(){		
		// Crée un fil d'exécusion parallèle au fil courant,
		threadComm = new SwingWorker(){
			@Override
			protected Object doInBackground() throws IOException{
				System.out.println("Le fils d'execution parallele est lance");
				//Configurations avec le serveur
				try 
				{
					inputStream= new BufferedReader((new InputStreamReader(connectionClient.getInputStream())));
					outputStream=new PrintWriter(new OutputStreamWriter(connectionClient.getOutputStream()));
					while(true)
					{
						
						Thread.sleep(DELAI);
						if(isActif)
						{
							//System.out.println(inputStream.readLine());
							outputStream.println("GET");
							outputStream.flush();
							if (inputStream.read()!=0)
							{
							
								String temp=inputStream.readLine();
								temp=inputStream.readLine();
								if(temp==null)
								{
									if(listenerChangementPropriete!=null)
									{							
										firePropertyChange(ProprietesChangees.SERVEUR_TOMBE.toString(), null, null); 	
									}
								}
								System.out.println(temp);
			
								if(listenerChangementPropriete!=null)
									   firePropertyChange(ProprietesChangees.FORME_AJOUTEE.toString(), null, (Object) temp); 
							}
						}
					}
						// C'EST DANS CETTE BOUCLE QU'ON COMMUNIQUE AVEC LE SERVEUR
	 					//La méthode suivante alerte l'observateur 
						
					}
					catch (IOException | InterruptedException e) 
					{
						e.printStackTrace();
					}
					finally
					{
						inputStream.close();
						outputStream.close();
						connectionClient.close();
					}
				return null;
			}
		};
		// La méthode "propertyChange" de ApplicationFormes sera donc appelée lorsque le SwinkWorker invoquera la méthode "firePropertyChanger" 		
		if(listenerChangementPropriete!=null)
			threadComm.addPropertyChangeListener(listenerChangementPropriete);
		threadComm.execute(); // Lance le fil d'exécution parallèle.
		isActif = true;
		
//		outputStream.close();
	}
	
	/**
	 * @return si le fil d'exécution parallèle est actif
	 */
	public boolean isActif(){
		return isActif;
	}
	public void setStatus(boolean status)
	{	
		this.isActif=status;
	}
	public void setConnectionClient(Socket connectionClient) 
	{
		this.connectionClient = connectionClient;
	}
	public Socket getConnectionClient() {
		return connectionClient;
	}
	public SwingWorker getThreadComm() {
		return threadComm;
	}


}
